package cn.linstudy.image;

/**
 * @Author ljp
 * @Date 2021/9/30 9:10
 * @Description
 */
import java.awt.Color;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.imageio.ImageIO;

/**
 * @Author XiaoLin
 * @Date 2021/10/9 9:48
 * @Description 图片工具类
 */
public class CharactersToImageUtil {

    public static void main(String[] args) throws  IOException {
        // 要在d盘下建立一个name.txt的文件夹，用来存放需要转成图片的内容，多个换行即可
        String fileName="D:/name.txt";
        // 将内容一行一行读出来
        List<String> nameList = readFileByLine(fileName);
        for (int i = 0; i < nameList.size(); i++) {
            // 调用下面的方法去生成图片
            generateImg(nameList.get(i));
        }

    }

        /**
        * @Description: 将文件中的文字一行一行读取出来并存放在List中返回
        * @Param: [filename] 文件名
        * @return java.util.List<java.lang.String>
        */
    public static List<String> readFileByLine(String filename) throws IOException, FileNotFoundException {
        List<String> stringList=new ArrayList<>();
        File file=new File(filename);
        InputStreamReader isr=new InputStreamReader(new FileInputStream(file),"UTF-8");
        BufferedReader reader=new BufferedReader(isr);
        String tmp;
        while((tmp=reader.readLine())!=null){
            stringList.add(tmp);
        }
        reader.close();
        return stringList;
    }


    /**
        * @Description: 生成图片的方法，通常直接调用这个方法
        * @Param: [string] 生成图片的文字内容
        * @return void
        */
    public static void generateImg(String string) throws IOException{
        // 设置图片宽高
        int width=400;
        int height=400;
        // 设置图片的路径
        String filename="D:/我的坚果云/"+string+".jpg";
        System.out.println(filename);
        File file=new File(filename);
        // 不需要引入外部字体
        Font font=new Font("黑体",Font.BOLD,60);
        // 引入外部字体
        // Font font =  getSelfDefinedFont("E:\\PangMenZhengDaoBiaoTiTi\\思源宋体.ttf");
        BufferedImage bi =new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2=(Graphics2D) bi.getGraphics();
        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2.setBackground(getRandomColor());
        g2.clearRect(0, 0, width, height);
        g2.setFont(font);
        FontMetrics fm = g2.getFontMetrics(font);
        int textWidth = fm.stringWidth(string);
        g2.setPaint(new Color(0,0,128));
        int widthX = (width - textWidth) / 2;
        // y设置高度，目前还没有研究出居中的方法
        g2.drawString(string, widthX , 220);
        ImageIO.write(bi,"jpg", file);
    }

    /**
        * @Description: 设置随机浅色颜色
        * @Param: []
        * @return java.awt.Color
        */
    private static Color getRandomColor() {
        Random random=new Random();
        // 我这边设置了返回浅色的图片，排除了深色
        return new Color(random.nextInt(255)%(255-230+1) + 200,random.nextInt(255)%(255-230+1) + 200,random.nextInt(255)%(255-230+1) + 200);
    }


    /**
     * @Description: 获取自定义字体的方法
     * @Param: [filepath]
     * @return java.awt.Font
     */
    private static java.awt.Font getSelfDefinedFont(String filepath){
        java.awt.Font font;
        File file = new File(filepath);
        try{
            font = java.awt.Font.createFont(java.awt.Font.TRUETYPE_FONT, file);
            font = font.deriveFont(Font.BOLD, 60);
        }catch (FontFormatException e){
            return null;
        }catch (FileNotFoundException e){
            return null;
        }catch (IOException e){
            return null;
        }
        return font;
    }
}

